Dataformのdependenciesオプションで依存関係を宣言する
概要
Dataformでは、データパイプラインの依存関係を管理するために主に2つの方法があります。
- ref関数を使用する方法
- dependenciesプロパティを使用する方法
これらの方法を用いることで、ETL(Extract, Transform, Load)プロセスの実行順序を制御し、データの整合性を保つことができます。
ref関数を使用する方法
ref関数は、DataformのSQLXファイル内で他のテーブルやビューを参照するために使用します。
これにより、依存関係が明確になり、Dataformが自動的に依存関係を管理します。
以下のように使用します。多くの場合でこちらを使用することが多いのではないでしょうか。
config {
type: "table"
}
SELECT * FROM ${ref("dataset.sample_table")}
しかしながら、ref関数を使用して依存関係を表す場合はSQL内でref関数を用いてテーブルを使用する必要があります。SQLで依存関係のあるテーブルを使用しないけれど、その処理が終わってから後続の処理を実行したい、という場合はdependenciesオプション
を用いると実現することができます。
上表のイメージとしては、処理CはSQL内で処理Aのテーブルを参照しており、処理Bは処理CのSQL内で直接参照されていないが処理C実行前に実行しておきたい処理です。dependenciesオプションを用いることで、このような依存関係を表現できます。
やってみる
dependenciesオプション
はconfigブロック内で以下の形式で使用します。
dependencies: [ "依存関係ファイル名1", "依存関係ファイル名2"]
configブロック内での実装例は以下となります。
config {
type: "table",
dependencies: ["test_2"]
}
test_1、test_2、test_3という3つのSQLXファイルを作成し、test_3がtest_1・test_2に依存しているようにしてみます。
config {
type: "table"
}
SELECT "test_1 table" AS col_1
config {
type: "table"
}
SELECT "test_2 table" AS col_1
config {
type: "table",
dependencies: ["test_2"]
}
SELECT * FROM ${ref("test_1")}
test_3のSQLXファイル内ではref関数でtest_1を、dependenciesオプションでtest_2を依存するように設定しています。
上記のSQLXを実装すると、以下のDAGとなります。
test_3がtest_1・test_2に依存している関係を表現することができました。
それではtest_3のdependenciesオプションを削除してDAGをみてみます。
test_2→test_3の依存関係がなくなっていることが確認できました。
上記より、dependenciesオプションを用いると依存関係を明示的にしていすることができることがわかりました。
まとめ
ref関数とdependenciesオプションの使い分けとしては以下となるイメージです。
ref関数 | dependenciesオプション |
---|---|
SQL内で依存関係がある場合 | SQL内で依存関係がないけれど依存させたい、明示的に依存関係を宣言したい |
普段ref関数で事足りていたのですが、どうしてもref関数ではうまく動かないデータフローがありましてdependenciesを用いて依存関係を表現した案件があり今回記事にしてみました。
この記事がだれかのお役に立てば幸いです。それではまた。ナマステー
参考